package com.mingke.java.task;

import java.util.concurrent.ExecutorService;

/**
 * 任务调度器
 */
public class TaskDispatch {

    private Task task;

    private TaskBlock block;

    /**
     * 任务调度执行方法
     * 此处设置complete方法回调必须在新线程中，如果放在外面直接执行则会因为没有设置监听器而出现空指针异常
     * @param executorService 线程池对象，未传入则单独创建一个新线程
     * @return 调度器本身
     */
    public TaskDispatch doDispatch(ExecutorService executorService) {
        //创建一个新线程异步执行
        Thread thread = new Thread(() -> {
            Object result = this.task.doTask();
            this.getBlock().complete(result);
        });

        if(executorService == null) {
            //直接启动线程
            thread.start();
        }else {
            //提交线程到线程池
            executorService.execute(thread);
        }

        return this;
    }

    private Task getTask() {
        return task;
    }

    private void setTask(Task task) {
        this.task = task;
    }

    private TaskBlock getBlock() {
        return block;
    }

    /**
     * 设置回调函数的方法。如果你熟悉前端/客户端编程，你应该更熟悉另一个名字--闭包
     * @param block 需要传入的闭包本体
     */
    public void setBlock(TaskBlock block) {
        this.block = block;
    }

    private TaskDispatch() {
    }

    public TaskDispatch(Task task) {
        this.task = task;
    }
}
